package org.micode.libs.pay.wxpay.vo;

import lombok.Data;
import org.apache.commons.lang3.StringUtils;

import javax.validation.constraints.NotBlank;
import java.util.HashMap;
import java.util.Map;

/**
 * 微信支付请求数据对象
 */
@Data
public class WeixinPayVO {

    /**
     * 商户订单号，商户网站订单系统中唯一订单号，必填
     */
    @NotBlank(message = "OutTradeNo is required")
    private String outTradeNo;

    /**
     * 订单名称，必填
     */
    @NotBlank(message = "Subject is required")
    private String subject;

    /**
     * 商品描述, 给客户显示的，必填
     */
    @NotBlank(message = "Body is required")
    private String body;

    /**
     * 标价币种
     */
    private String feeType = "CNY";

    /**
     * 付款金额， 单位:分，必填
     */
    @NotBlank(message = "TotalFee is required")
    private int totalFee;

    /**
     * 交易类型 WeixinTradeTypeEnum
     */
    private String tradeType;

    /**
     * 商品详情，可空
     */
    private String detail;

    /**
     * 附加数据，在查询API和支付通知中原样返回，可作为自定义参数使用
     */
    private String attach;

    /**
     * 设备号，可空 可以为终端设备号(门店号或收银设备ID)，PC网页或公众号内支付可以传"WEB"
     */
    private String deviceProfile;

    /**
     * 终端IP APP和网页支付提交用户端ip，Native支付填调用微信支付API的机器IP
     */
    private String spbillCreateIp;

    /**
     * 商品ID trade_type=NATIVE时(即扫码支付)，此参数必传。此参数为二维码中包含的商品ID，商户自行定义
     */
    private String productId;

    /**
     * 用户openId
     */
    private String openId;

    public Map<String, String> getRequestDataMap(String notifyUrl) {
        HashMap<String, String> data = new HashMap<>();

        data.put("body", body);
        data.put("out_trade_no", outTradeNo);
        data.put("fee_type", feeType);
        data.put("total_fee", String.valueOf(totalFee));
        data.put("spbill_create_ip", spbillCreateIp);
        data.put("notify_url", notifyUrl);
        data.put("trade_type", tradeType);

        if (StringUtils.isNotBlank(productId)) {
            data.put("product_id", productId);
        }

        if (StringUtils.isNotBlank(openId)) {
            data.put("openid", openId);
        }

        if (StringUtils.isNotBlank(detail)) {
            data.put("detail", detail);
        }

        if (StringUtils.isNotBlank(attach)) {
            data.put("attach", attach);
        }

        if (StringUtils.isNotBlank(deviceProfile)) {
            data.put("device_profile", deviceProfile);
        }

        return data;
    }

}
